﻿angular.module('app').directive('uiTable', function ($rootScope, $interval, tabService) {
    return function (scope, element, attrs) {
        // apply DataTable options, use defaults if none specified by user
        var options = {};
        if (attrs.uiTable.length > 0) {
            options = scope.$eval(attrs.uiTable);
        } else {
            options = {
                //jQueryUI: false,//控制是否使用jquerui的样式（需要引入jqueryui的css）。默认值false
                info: true,//控制是否显示表格左下角的信息。默认值true
                lengthChange: false,//是否允许用户改变表格每页显示的记录数。默认值true
                ordering: true,//是否允许Datatables开启排序。默认值true
                paging: true,//是否开启本地分页。默认值true
                processing: true,//是否显示处理状态(排序的时候，数据很多耗费时间长的话，也会显示这个)。默认值false
                //scrollX: true,//设置水平滚动。默认值false
                //scrollY: '200px',//设置垂直滚动
                //scrollCollapse: true,//当显示更少的记录时，是否允许表格减少高度。默认值false
                searching: true,//是否允许Datatables开启本地搜索。默认值true
                //serverSide: true,//是否开启服务器模式。默认值false
                stateSave: false,//保存状态 - 在页面重新加载的时候恢复状态（页码等内容）。默认值false
                stateDuration: 60 * 60 * 24,//间隔多长时间保存一次状态。默认值7200    //设置stateSave为true时使用；单位s；值为-1时使用sessionStorage
                //autoWidth: false,//控制Datatables是否自适应宽度。默认值true
                //deferRender: true,//控制Datatables的延迟渲染，可以提高初始化的速度。默认值false
                //deferLoading: [57, 100],//延迟请求加载服务端的数据，直到表格第二次绘制。默认值null    //与serverSide: true配合使用；deferLoading: 57表示57 records available in the table, no filtering applied；deferLoading: [57, 100]表示57 records after filtering, 100 without filtering (an initial filter applied)
                destroy: true,//销毁所有符合选择的table，并且用新的options重新创建表格。默认值false
                //displayStart: 20,//初始化显示的时候从第几条数据开始显示(一开始显示第几页)。默认值0    //使用这个参数的前提是得开启分页特性 paging:true；displayStart: 20表示，如果你是每页显示10条数据，希望表格初始化的时候显示的是第三页的数据，你应该设置为 20
                //dom: '<"wrapper"flipt>',//定义DataTables的组件元素的显示和显示顺序。默认值'lfrtip'    //有进阶用法
                lengthMenu: [10, 25],//定义在每页显示记录数的select中显示的选项。默认值[ 10, 25, 50, 100 ]
                //orderCellsTop: true,//控制表头的哪一个cell可以应用于该列的排序响应。默认值false
                //orderClasses: true,//高亮显示在table的body中排序的列。默认值true
                //orderFixed: [0, 'asc'],//在表格中总是起作用的排序    //有进阶用法
                //orderMulti: false,//控制多列排序。默认值true
                //order: [[0, 'asc'], [1, 'asc']],//表格在初始化的时候的排序。默认值[[0, 'asc']]
                //pageLength: 25,//改变初始的页面长度(每页显示的记录数)。默认值10
                pagingType: 'full_numbers',//分页按钮的显示方式。默认值'simple_numbers'    //可取值：numbers、simple、simple_numbers、full、full_numbers
                //renderer: 'bootstrap',//显示组件的渲染方式    //还可设置 renderer: {header: 'jqueryui', pageButton: 'bootstrap'}
                //retrieve: true,//检索已经存在的Datatables实例。默认值false
                //rowId: 'info.id',//数据属性，Datatables在渲染的时候给tr设置的ID。默认值'DT_RowId'    ///有进阶用法
                //scrollCollapse: true,//当显示更少的记录时，是否允许表格减少高度。默认值false
                //search: {//设置一个全局的过滤条件
                //    caseInsensitive: false,//在搜索或者过滤时，是否不区分大小写。默认值true
                //    regex: true,//允许或者禁止对在搜索字符串中出现的正则表达式字符强制编码。默认值false
                //    search: 'abc',//初始化时的表格的过滤（搜索）条件
                //    smart: false,//允许或者禁止DataTables的智能过滤（搜索）功能。默认值true    //如果你使用search.regex参数，可能需要关掉这个智能搜索，如果一个自定义的正则表达式还没有输入完整，可能体验不会很好，那么关闭智能搜索即可
                //},
                //searchCols: [//给每一列定义一个初始的搜索条件
                //    null,
                //    //第二列初始化过滤条件为 My filter
                //    { search: 'My filter' },
                //    null,
                //    //第四列初始化过滤条件为 使用正则表达式 ^[0-9] 来过滤
                //    { search: '^[0-9]', 'escapeRegex': false }
                //],
                //searchDelay: 500,//设定搜索的间隔时间。默认值null    //以 ms 为单位；这个延迟参数只针对全局搜索有效，如果是search() , column().search() 方法则此参数不会生效，需要使用 $.fn.dataTable.util.throttle() 来处理；searchDelay 默认值为 null ， 他会自己判断如果是客户端模式，值为 Instant （及时），如果是服务器模式，值为 400ms
                //stripeClasses: ['strip1', 'strip2', 'strip3'],//设置斑马条（奇偶行）的css class    //可以是任意长度的数组，你设置2个，那么就1 2 ， 1 2 ， 1 2 这么循环，如果设置3个就是 1 2 3， 1 2 3， 1 2 3，这么循环
                //tabIndex: 1,//用键盘上的Tab键浏览时的顺序。默认值0
                language: {//所有DataTables的语言配置都在这里
                    url: 'vendor/jquery/datatables/Chinese.json'//从远程地址中加载语言信息
                    //decimal: ',',//小数点表示字符（有些文化中用"，"表示小数点）。默认值''
                    //emptyTable: 'No data available in table',//当表格没有数据时，表格所显示的字符串。默认值'No data available in table'
                    //info: 'Showing page _PAGE_ of _PAGES_',//表格的page分页所需显示的所有字符串。默认值'Showing _START_ to _END_ of _TOTAL_ entries'
                    //infoEmpty: 'No entries to show',//当表格没有数据时，汇总地方显示的字符串。默认值'Showing 0 to 0 of 0 entries'
                    //infoFiltered: ' - filtered from _MAX_ records',//当表格搜索后，在汇总字符串上需要增加的内容。默认值'(filtered from _MAX_ total entries)'
                    //infoPostFix: 'All records shown are derived from real information.',//在汇总字符串上始终增加的字符串。默认值''
                    //lengthMenu: 'Display _MENU_ records',//'每页显示记录'的下拉框的提示信息。默认值'Show _MENU_ entries'
                    //loadingRecords: 'Please wait - loading...',//加载数据时的提示信息 - 当 Ajax请求数据时显示。默认值'Loading...'    //与ajax配合使用
                    //processing: 'DataTables is currently busy',//当table处理用户处理信息时，显示的信息字符串。默认值'Processing...'
                    //search: 'Filter records:',//搜索框的提示信息。默认值'Search:'
                    //searchPlaceholder: 'Search records',//搜索框(input)的placeholder属性。默认值''
                    //thousands: "'",//千位的分隔符。默认值','
                    //url: '/dataTables/i18n/de_de.lang',//从远程地址中加载语言信息
                    //zeroRecords: 'No records to display',//当搜索结果为空时，显示的信息。默认值'No matching records found'
                    //paginate: {//分页信息显示所需的字符串的所有信息
                    //    first: 'First page',//分页信息的 'first' 按钮显示的信息。默认值'First'
                    //    last: 'Last page',//分页信息的 'last' 按钮显示的信息。默认值'Last'
                    //    next: 'Next page',//分页信息的 'next' 按钮显示的信息。默认值'Next'
                    //    previous: 'Previous page'//分页信息的 'previous' 按钮显示的信息。默认值'Previous'
                    //},
                    //aria: {//Language strings used for WAI-ARIA（无障碍网页应用） specific attributes
                    //    sortAscending: ' - click/return to sort ascending',//默认值': activate to sort column ascending'
                    //    sortDescending: " - click/return to sort descending"//默认值': activate to sort column descending'
                    //}
                }
            };
        }

        // Tell the dataTables plugin what columns to use
        // We can either derive them from the dom, or use setup from the controller
        var explicitColumns = [];
        element.find('th').each(function (index, elem) {
            explicitColumns.push($(elem).text());
        });
        if (explicitColumns.length > 0) {
            options["aoColumns"] = explicitColumns;
        } else if (attrs.aoColumns) {
            options["aoColumns"] = scope.$eval(attrs.aoColumns);
        }

        // aoColumnDefs is dataTables way of providing fine control over column config
        if (attrs.aoColumnDefs) {
            options["aoColumnDefs"] = scope.$eval(attrs.aoColumnDefs);
        }

        if (attrs.fnRowCallback) {
            options["fnRowCallback"] = scope.$eval(attrs.fnRowCallback);
        }

        // apply the plugin
        var dataTable = element.dataTable(options);

        if (attrs.tableControl) {
            for (var item in scope) {
                if (item == attrs.tableControl) {
                    scope[item] = dataTable;
                    break;
                }
            }
        }

        // watch for any changes to our data, rebuild the DataTable
        scope.$watch(attrs.aaData, function (value) {
            var val = value || null;
            if (val) {
                dataTable.fnClearTable();
                dataTable.fnAddData(scope.$eval(attrs.aaData));
                if ($rootScope.timeMethod == null) {
                    $rootScope.timeMethod = $interval(function () {
                        var selectedTab = tabService.getTabByMenuID();
                        if(selectedTab==null){
                            return;
                        }
                        var contentElement = angular.element("#" + "myMenu" + selectedTab.id).find(".contentElement");
                        if (contentElement.find(".dataTables_scrollBody").length > 0) {
                            setAutoTableHeight(contentElement);
                            setAutoTableHead(contentElement);
                        }
                    }, 1000);
                }
                $rootScope.$on('$destroy', function () {
                    $interval.cancel($rootScope.timeMethod);
                });
            }
            else
            {
                dataTable.fnClearTable();
            }
        });
    };
});